0654. 最大二叉树【中等】
1. 📝 题目描述
给定一个不重复的整数数组 nums。 最大二叉树 可以用下面的算法从 nums 递归地构建:
- 创建一个根节点,其值为
nums中的最大值。 - 递归地在最大值左边的子数组前缀上构建左子树。
- 递归地在最大值右边的子数组后缀上构建右子树。
返回 nums 构建的最大二叉树。
示例 1:

txt
输入:nums = [3,2,1,6,0,5]
输出:[6,3,5,null,2,0,null,null,1]
解释:递归调用如下所示:
- [3,2,1,6,0,5] 中的最大值是 6,左边部分是 [3,2,1],右边部分是 [0,5]。
- [3,2,1] 中的最大值是 3,左边部分是 [],右边部分是 [2,1]。
- 空数组,无子节点。
- [2,1] 中的最大值是 2,左边部分是 [],右边部分是 [1]。
- 空数组,无子节点。
- 只有一个元素,所以子节点是一个值为 1 的节点。
- [0,5] 中的最大值是 5,左边部分是 [0],右边部分是 []。
- 只有一个元素,所以子节点是一个值为 0 的节点。
- 空数组,无子节点。1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
示例 2:

txt
输入:nums = [3,2,1]
输出:[3,null,2,null,1]1
2
2
提示:
1 <= nums.length <= 10000 <= nums[i] <= 1000nums中的所有整数 互不相同
2. 🎯 s.1 - 递归
c
struct TreeNode* build(int* nums, int l, int r) {
if (l > r) return NULL;
int maxIdx = l;
for (int i = l + 1; i <= r; i++) {
if (nums[i] > nums[maxIdx]) maxIdx = i;
}
struct TreeNode* node = (struct TreeNode*)malloc(sizeof(struct TreeNode));
node->val = nums[maxIdx];
node->left = build(nums, l, maxIdx - 1);
node->right = build(nums, maxIdx + 1, r);
return node;
}
struct TreeNode* constructMaximumBinaryTree(int* nums, int numsSize) {
return build(nums, 0, numsSize - 1);
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
js
/**
* @param {number[]} nums
* @return {TreeNode}
*/
var constructMaximumBinaryTree = function (nums) {
const build = (l, r) => {
if (l > r) return null
let maxIdx = l
for (let i = l + 1; i <= r; i++) {
if (nums[i] > nums[maxIdx]) maxIdx = i
}
const node = new TreeNode(nums[maxIdx])
node.left = build(l, maxIdx - 1)
node.right = build(maxIdx + 1, r)
return node
}
return build(0, nums.length - 1)
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
py
class Solution:
def constructMaximumBinaryTree(self, nums: List[int]) -> Optional[TreeNode]:
def build(l, r):
if l > r:
return None
max_idx = l
for i in range(l + 1, r + 1):
if nums[i] > nums[max_idx]:
max_idx = i
node = TreeNode(nums[max_idx])
node.left = build(l, max_idx - 1)
node.right = build(max_idx + 1, r)
return node
return build(0, len(nums) - 1)1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
- 时间复杂度:
,最坏情况每次需要遍历整个数组找最大值 - 空间复杂度:
,递归栈深度
算法思路:
- 找到当前范围内最大值作为根节点
- 左侧子数组递归构建左子树,右侧子数组递归构建右子树